package org.x.user.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.lang.Long;
import java.util.ArrayList;
import java.util.Date;
import java.lang.String;
import java.lang.Integer;
import java.util.List;

/**
 * 菜单表 实体类。
 *
 * @author mybatis-flex-helper automatic generation
 * @since 1.0
 */
@Table(value = "sys_menu")
@Data
@AllArgsConstructor// 有参构造
@NoArgsConstructor//无参构造
public class SysMenuEntity {

    /**
     * 菜单ID
     * 方法一：使用@RequestParam注解（适用于Controller方法参数）
     * 如果Controller方法直接接收参数：
     * @GetMapping("/menu")
     * public Result getMenu(@RequestParam("menuId") Long id) {
     *     // 使用id查询
     * }
     * 但用户可能是想直接用实体类接收，比如：
     * @PostMapping("/menu")
     * public Result createMenu(@RequestBody SysMenuEntity menu) {
     *     // 此时menu的id字段需要对应请求中的menuId
     * }
     * 这种情况下，@RequestParam不适用，需要用@JsonProperty。
     * 方法二：在实体类字段上添加@JsonProperty("menuId")
     * 如果请求是JSON格式，使用Jackson的@JsonProperty注解：
     * import com.fasterxml.jackson.annotation.JsonProperty;
     * public class SysMenuEntity {
     *     @Id(keyType = KeyType.Auto)
     *     @JsonProperty("menuId")
     *     private Long id;
     * }
     * 这样，当请求中的JSON包含menuId时，会映射到id字段
     *
     */
    @Id(keyType = KeyType.Auto)
    @Column(value = "id")
    private Long id;


    /**
     * 菜单名称
     */
    @Column(value = "name")
    private String name;

    /**
     * 图标标识
     */
    @Column(value = "icon")
    private String icon;

    /**
     * 前端路由路径
     */
    @Column(value = "path")
    private String path;

    /**
     * 父菜单ID
     */
    @Column(value = "parent_id")
    private Long parentId;

    /**
     * 排序
     */
    @Column(value = "sort")
    private Integer sort;

    /**
     * 关联权限ID
     */
    @Column(value = "acl_id")
    private Long aclId;

    /**
     * 逻辑删除
     */
    @Column(value = "is_delete")
    private Integer isDelete;

    /**
     * 是否隐藏   0是显示  1是隐藏
     */
    @Column(value = "hidden")
    private Boolean hidden;

    /**
     * 创建时间
     */
    @Column(value = "created_time")
    private Date createdTime;
    
    /**
     * 子菜单列表
     */
    @JsonProperty("children")
    private List<SysMenuEntity> children = new ArrayList<>();

}
